package game;

public class CalculosMatriz 
{
	private static CalculosMatriz instance;
	
	public static CalculosMatriz getInstace()
	{
		if(instance == null)
			instance = new CalculosMatriz();
			
		return instance;
		
	}
	
	public double[][] OpostarMatriz(double matriz[][], int numColunas, int numLinhas)
	{
		double total[][] = new double[numColunas][numLinhas];
		
		for(int x = 0; x < numColunas; x++)
			for(int y = 0; y < numLinhas; y++)
				total[x][y] = matriz[x][y] * -1;
		
		
		return total;
	}
	
	public double[][] TransportarMatriz(double numeros[][])
	{
		double numeros2[][] = new double[numeros.length][numeros.length];
		
		for(int x = 0; x < numeros.length; x++)
		{
			for(int y = 0; y < numeros.length; y++)
			{
				numeros2[x][y] = numeros[y][x];
			}
		}
		return numeros2;
	}

	public double[][] DiminuirMatrizes(double matriz1[][], double matriz2[][], int numColunas, int numLinhas)
	{
		double total[][] = new double[numColunas][numLinhas];
		
		for(int x = 0; x < numColunas; x++)
			for(int y = 0; y < numLinhas; y++)
				total[x][y] = matriz1[x][y] - matriz2[x][y];
		
		
		return total;
	}

	public double[][] MultiplicarPorNumero(double[][] multiplicador, double matriz[][], int numColunas, int numLinhas)
	{
		double total[][] = new double[numColunas][numLinhas];
		
		for(int x = 0; x < numColunas; x++)
			for(int y = 0; y < numLinhas; y++)
				total[x][y] = multiplicador[0][0] * matriz[x][y];
		
		
		return total;
	}

	public double[][] MultiplicarPorMatriz(double matriz[][], double matriz2[][])
	{
		double total[][] = new double[matriz.length][matriz.length];
		
		for(int x2 = 0; x2 < matriz.length; x2++)
		{
			for(int y1 = 0; y1 < matriz.length; y1++)
			{
				for (int i = 0; i < matriz.length; i++)
					total[x2][y1] += (matriz[x2][i] * matriz2[i][y1]);
			}
		}
	
		return total;
	}

	public double[][] SomarMatrizes(double matriz1[][], double matriz2[][], int numColunas, int numLinhas)
	{
		double total[][] = new double[numColunas][numLinhas];
		
		for(int x = 0; x < numColunas; x++)
			for(int y = 0; y < numLinhas; y++)
				total[x][y] = matriz1[x][y] + matriz2[x][y];
		
		
		return total;
	}
	
	public double[][] DeterminanteMatriz(double numeros[][])
	{
		
		double num[][];
		Double total = (double)0;
		
		if(numeros.length == 2)
		{
			num = numeros;
			total += num[0][0] * num[1][1];
			total -= num[1][0] * num[0][1];
		}
		else if(numeros.length == 3)
		{
			num = new double[(numeros.length*2)-1][numeros.length];
			for(int x = 0; x < (numeros.length*2)-1; x++)
			{
				for(int y = 0; y < numeros.length; y++)
				{
					if(x >= numeros.length)
						num[x][y] = numeros[x - numeros.length][y];
					else
						num[x][y] = numeros[x][y];
				}
			}
			
			total += num[0][0] * num[1][1] *  num[2][2];
			total += (num[1][0] * num[2][1] *  num[3][2]);
			total += (num[2][0] * num[3][1] *  num[4][2]);
			
			
			total -= num[2][2] * num[3][1] *  num[4][0];
			total -= num[1][2] * num[2][1] *  num[3][0];
			total -= num[0][2] * num[1][1] *  num[2][0];
		}
		
		double[][] total2 = new double[1][1];
		total2[0][0] = total;
		return total2;
	}



}
